Powershell scripts/Export Containers Affected Components/DFC_AffectedCmp.ps1 (61 lines of code) (raw):
#######################################################################################
# This sample script allows you to export affected components from your kubernetes #
# clusters and creates a CSV file with your affected components across your #
# environment. Prerequisites: #
# - Latest Az PowerShell module #
# - logged into to Azure (login-AzAccount) #
# - output folder and filename #
#######################################################################################
# Params
#$subId = 'XXXXXXXX-YYYY-ZZZZ-AAAA-QQQQQQQQQQQQ' # use your sub id
$subId = Read-Host "Enter your Sub ID"
$policyDefinitionId = '/providers/Microsoft.Authorization/policyDefinitions/febd0533-8e55-448f-b837-bd0e06f16469'
#Definition ID febd0533-8e55-448f-b837-bd0e06f16469 = Kubernetes cluster containers should only use allowed images
#Defintion ID can be replaced with any other definition id from the policy defintion.
$ErrorActionPreference = 'Stop'
$outputFolder = "c:\Tmp" # use format "c:\temp"
$outputFileName = "AffectedComponents.csv"
$RecommendationTable = @()
$RecommendationName
$values = @()
# Variables:
$azureSecurityBenchmarkAssignment = "/subscriptions/$subId/providers/Microsoft.Authorization/policyAssignments/SecurityCenterBuiltIn"
$RecommendationName= Get-AzPolicyDefinition -SubscriptionId $subid -Builtin | Where-Object{$_.PolicyDefinitionId -eq $policyDefinitionId} | Select-Object -ExpandProperty Properties | Select-Object DisplayName
# Get all clusters
$clustersIds = az rest -m get -u "https://management.azure.com/subscriptions/$subId/providers/Microsoft.ContainerService/managedClusters?api-version=2022-11-01" --query "value[*].id" -o tsv
# Iterate all clusters
try {
foreach ($clusterId in $clustersIds) {
Write-Host "Finding affected components in cluster: $clusterId"
$query = "https://management.azure.com$clusterId/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&`$filter=policyAssignmentId eq '$azureSecurityBenchmarkAssignment' and policyDefinitionId eq '$policyDefinitionId'&`$expand=components(`$filter=complianceState eq 'NonCompliant' and type ne '*')"
$affectedcomponents = az rest -m post -u $query --query "value[0].components" -o tsv
#$affectedcomp = az rest -m post -u $query --query "value[0].components" -o table
# Iterate affected components
if ($affectedcomponents -ne $null)
{
foreach ($component in $affectedcomponents){
$values = $component -split '\s+'
$Recommendations = New-Object psobject -Property @{
ClusterID = $clusterId
RecommendationName = $RecommendationName.DisplayName
Compliant = $values[0]
Namespace = $values[1]
PodName = $values[2]
Date = $values[3]
type = $values[4]
}
$RecommendationTable += $Recommendations
Write-Host "Affected component: $component"
}
}
}
}
catch {
Write-Host "Error Message: " $_.Exception.Message -ForeGroundColor Red
}
try
{
$RecommendationTable | Select-Object "ClusterID", "RecommendationName", "Compliant", "Namespace", "PodName", "Date", "type" | Export-Csv -Path ($outputFolder + "\" + $outputFileName) -Force -NoTypeInformation
Write-Host "Done! `r`n" -ForegroundColor Yellow
}
catch {Write-Host "Could not create output file.... Please check your path, filename and write permissions." -ForeGroundColor Red}